package algorithm_learn.random;

public class Code_RandToRand {
    public static void main(String[] args) {
        System.out.println("测试开始");
        //Math.random() --> double --> [0,1)
        int testTimes = 1000000;
        int count = 0;
        for (int i=0;i<testTimes;i++){
            if(Math.random()<0.3){
                count++;
            }
        }
        System.out.println((double) count/ (double)testTimes);
        System.out.println("--------------------");

        //[0,1) * 8 ---> [0,7]
        count = 0;
        for (int i=0;i<testTimes;i++){
            if(Math.random() * 8 <5){
                count++;
            }
        }
        System.out.println((double) count/ (double)testTimes);


        System.out.println("--------------------");
        int K = 9;
        //[0,k) --> [0,8]
        int[] counts = new int[9]; // counts 来统计数据出现的次数 第九位用于统计总次数
        for (int i=0;i<testTimes;i++){
            int ans = (int)(Math.random() * K);
            counts[ans]++;
        }
        for (int i=0;i<counts.length;i++){
            System.out.println(i+"这个数出现了："+counts[i]);
        }

        System.out.println("---------------");
        count = 0;
        double x = 0.7;
        for (int i =0;i<testTimes;i++){
            if(xToXPower2() < x){
                count++;
            }
        }
        System.out.println((double) count/(double) testTimes);
        System.out.println(Math.pow(x,2));


        System.out.println("=================");
        counts = new int[8];
        for (int i=0;i<testTimes;i++){
            int nums = g();
            counts[nums]++;
        }
        for (int i=0;i<8;i++){
            System.out.println(i+"这个数，出现了 "+counts[i]+ " 次");
        }
    }

    //返回[0,1)小数
    //将x概率调整为x平方
    public static double xToXPower2(){
        return Math.max(Math.random(),Math.random());
    }
    //返回[0,1)小
    //将x概率调整为x三次
    public static double xToXPower3(){
        return Math.max(Math.random(),Math.max(Math.random(),Math.random()));
    }

    //介绍随机函数
    //从f() a~b随机到g() c~d随机 即[1，5] ---》 [1,7] 先转成 【0，6】 然后加一
    public static int f(){
        return (int)(Math.random() * 5) + 1;
    }
    //只能用f() 实现等概率返回0或1
    public static int f1(){
        int ans = 0;
        do{
            ans = f();
        }while (ans==3);
        //1 2 --> 0 |  3 4 ---> 1
        return ans < 3 ? 0: 1;
    }

    //得到000 ~ 111做到等概率 （转化到 [0--7]） 目标是 [1--7]
    public static int f3(){
        //二进制分别代表转换后端0-7
        int ans = (f1() << 2) + (f1() << 1) + (f1() << 0);
        return ans;
    }

    //遇到7就重做  实现[0--6]
    public static int f4(){
        int ans = 0;
        do{
            ans = f3();
        }while (ans == 7);
        return ans;
    }
    //实现[1--7]
    public static int g(){
        return f4()+1;
    }
    //x是以固定概率返回0-1，不是等概率
    public static int x(){
        return  Math.random() < 0.84 ? 1 : 0;
    }
    //等概率返回0和1 也是用二进制的方式
    public static int y(){
        int ans = 0;
        do{
            //第一次 0(1)
            ans =x();
            //第二次 0(1)
            //重做
        }while (ans == x());
        return ans;
    }

}
